using System.Collections.Immutable;
using ThingsEdge.Exchange.Contracts;

namespace Digitalmes.Infrastructure.Scada.Extensions;

/// <summary>
/// <see cref="RequestMessage"/> 扩展方法。
/// </summary>
public static class RequestMessageExtensions
{
    /// <summary>
    /// 提取标记文本对象，不存在则返回 null，其中值对象会转换为字符串，数组会转化为 JSON 文本格式。
    /// </summary>
    /// <param name="message"></param>
    /// <param name="tagName">标记名称</param>
    /// <returns></returns>
    public static string? GetString(this RequestMessage message, string tagName)
    {
        return message.GetData(tagName)?.GetString();
    }

    /// <summary>
    /// 提取标记对象转换为 Int32 类型，不存在或转换失败则返回 null。
    /// </summary>
    /// <param name="message"></param>
    /// <param name="tagName"></param>
    /// <returns></returns>
    public static int? AsInt32(this RequestMessage message, string tagName)
    {
        if (message.GetData(tagName)?.TryGetAsInt32(out var v) == true)
        {
            return v;
        }

        return default;
    }

    /// <summary>
    /// 提取标记对象转换为 double 类型，不存在或转换失败则返回 null。
    /// </summary>
    /// <param name="message"></param>
    /// <param name="tagName"></param>
    /// <returns></returns>
    public static double? AsDouble(this RequestMessage message, string tagName)
    {
        if (message.GetData(tagName)?.TryGetAsDouble(out var v) == true)
        {
            return v;
        }

        return default;
    }

    /// <summary>
    /// 获取消息中 PayloadData 额外属性 "Identity" 有标记为 "Attach" 的数据集合。
    /// </summary>
    /// <param name="message"></param>
    /// <returns></returns>
    public static IReadOnlyList<PayloadData> GetAttachPayloadDataList(this RequestMessage message)
    {
        return message.Values
            .Where(s => s.GetExtraValue<string>("Identity") == "Attach")
            .ToImmutableList();
    }
}
